-- Copyright (c) 2007 Maksym Motornyy <mmotorny@gmail.com>
--
-- Permission is hereby granted, free of charge, to any person obtaining a copy
-- of this software and associated documentation files (the "Software"), to deal
-- in the Software without restriction, including without limitation the rights
-- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-- copies of the Software, and to permit persons to whom the Software is
-- furnished to do so, subject to the following conditions:
--
-- The above copyright notice and this permission notice shall be included in
-- all copies or substantial portions of the Software.
--
-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-- THE SOFTWARE.

module Main where

import HPython.Interpreter
import HPython.Lexer
import HPython.Parser
import Text.ParserCombinators.Parsec
import Control.Exception hiding (catch)
import System.Environment
import System.IO

-- TODO:
-- document everything with citations from LRM and PEPs
-- (this will ensure everything is implemented well)

processFile :: String -> IO ()
processFile _filePath =
	bracket
		(openBinaryFile _filePath ReadMode)
		hClose
		(\_fileHandle -> do
			_fileContents <- hGetContents _fileHandle
			case runParser lexer (LexerState [0] 0) _filePath _fileContents of
				Left _lexerError -> 
					putStrLn $ show _lexerError
				Right _lexemes -> do
					putStrLn $ show _lexemes
					case runParser fileInput () _filePath _lexemes of
						Left _parserError -> 
							putStrLn $ show _parserError
						Right _statements ->
							catchDyn
								(interpret _statements)
								(\(_exception :: PythonException) ->
									putStrLn $ show _exception
								)
		)

main :: IO ()
main = do
	_args <- getArgs
	if length _args /= 1
		then putStrLn "Usage: HPython file"
		else 
			catch 
				(processFile $ _args !! 0)
				(\_exception -> putStrLn $ show $ _exception)
